package com.witsight.platform.util.lang;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang3.math.NumberUtils;

/**
 * 说明：数据工具类
 * 
 * @Title: NumberUtil.java
 * @Package com.witsight.platform.util.lang
 * @See: {@link NumberUtils} Copyright: Copyright (c) 2017 Company:sany huax witsight team by product
 * @author: penght
 * @date: 2017年9月11日 下午3:03:04
 * @version: V1.0
 *
 */
public abstract class NumberUtil extends NumberUtils {
	/**
	 * 
	 * 说明：判断字符串是否是double数字格式
	 * 
	 * @Title: isDoubleNumber
	 * @See: {@link #isDoubleNumber(String value)}
	 * @author wumingqian
	 * @param value
	 *            带检查字符串
	 * @return boolean true是都变了格式字符串
	 * @date: 2018年5月11日 下午4:42:00
	 */
	public static boolean isDoubleNumber(String value) {
		if (StringUtil.isBlank(value)) {
			return false;
		}
		String patternStr = "^\\d+(\\.\\d+)?$";
		Pattern p = Pattern.compile(patternStr, Pattern.CASE_INSENSITIVE); // 忽略大小写;
		Matcher m = p.matcher(value);
		return m.matches();
	}
	/**
	 * 
	 * 说明：将数字字符串转化为double
	 * 
	 * @Title: coverStringToDouble
	 * @See: {@link #coverStringToDouble(String numString)}
	 * @author wumingqian
	 * @param numString
	 *            带转化字符串
	 * @return double 转化结果
	 * @date: 2018年5月11日 下午1:59:31
	 */
	public static double coverStringToDouble(String numString) {
		if (isDoubleNumber(numString)) {
			BigDecimal one = new BigDecimal(numString);
			return one.doubleValue();
			// return Double.parseDouble(numString);
		} else {
			return 0.0;
		}

	}
	/**
	 * 
	 * 说明：将数字字符串转化为double
	 * 
	 * @Title: coverStringToDouble
	 * @See: {@link #coverStringToDouble(String numString)}
	 * @author wumingqian
	 * @param numString
	 *            带转化字符串
	 * @return double 转化结果
	 * @date: 2018年5月11日 下午1:59:31
	 */
	public static Long coverStringToLong(String numString) {
		if (isDoubleNumber(numString)) {
			BigDecimal one = new BigDecimal(numString);
			return one.longValueExact();
		} else {
			return (long) 0;
		}

	}
	/**
	 * 说明：声明常量FULL_NUMBER
	 */
	public static final String FULL_NUMBER = "###,##0.00";
	private static final double ZORE_VALUE = 1e-5;

	/**
	 * 说明：浮点型科学计数法转换为字符串
	 * 
	 * @Title: convertFloatToString
	 * @See: {@link #convertFloatToString(float)}
	 * @author wangt
	 * @param floatData
	 * @return String 类型
	 * @date: 2016年12月1日 上午10:39:58
	 */
	public static String convertToString(float floatData) {
		return BigDecimal.valueOf(floatData).toPlainString();
	}

	/**
	 * 说明：浮点型科学计数法转换为字符串
	 * 
	 * @Title: convertFloatToString
	 * @See: {@link #convertFloatToString(double)}
	 * @author wumingqian
	 * @param floatData
	 * @return String 类型
	 * @date: 2016年12月1日 上午10:39:58
	 */
	public static String convertToString(double floatData) {
		return BigDecimal.valueOf(floatData).toPlainString();
	}

	/**
	 * 说明：两个数相加
	 * 
	 * @Title: add
	 * @See: {@link #add(float, float)}
	 * @author wangt
	 * @param v1
	 * @param v2
	 * @return
	 * @date: 2016年12月2日 下午4:42:30
	 */
	public static float add(float v1, float v2) {// 加法
		BigDecimal b1 = BigDecimal.valueOf(v1);
		BigDecimal b2 = BigDecimal.valueOf(v2);
		return b1.add(b2).floatValue();
	}

	/**
	 * 说明：两个数相加
	 * 
	 * @Title: add
	 * @See: {@link #add(double, double)}
	 * @author wumingqian
	 * @param v1
	 * @param v2
	 * @return
	 * @date: 2016年12月2日 下午4:42:30
	 */
	public static double add(double v1, double v2) {// 加法
		BigDecimal b1 = BigDecimal.valueOf(v1);
		BigDecimal b2 = BigDecimal.valueOf(v2);
		return b1.add(b2).doubleValue();
	}
	/**
	 * 
	 * 说明：两个数相加
	 * @Title: add
	 * @See: {@link #add(Integer, Integer)}
	 * @author yangbin
	 * @param v1
	 * @param v2
	 * @return 
	 * @date: 2018年7月4日 下午3:12:12
	 */
	public static int add(Integer v1, Integer v2) {// 加法
		BigDecimal b1 = BigDecimal.valueOf(v1);
		BigDecimal b2 = BigDecimal.valueOf(v2);
		return b1.add(b2).intValue();
	}

	/**
	 * 说明：两个数相减
	 * 
	 * @Title: sub
	 * @See: {@link #sub(float, float)}
	 * @author wangt
	 * @param v1
	 * @param v2
	 * @return
	 * @date: 2016年12月2日 下午4:44:53
	 */
	public static float sub(float v1, float v2) {// 减法
		BigDecimal b1 = BigDecimal.valueOf(v1);
		BigDecimal b2 = BigDecimal.valueOf(v2);
		return b1.subtract(b2).floatValue();
	}

	/**
	 * 说明：两个数相减
	 * 
	 * @Title: sub
	 * @See: {@link #sub(double, double)}
	 * @author wumingqian
	 * @param v1
	 * @param v2
	 * @return
	 * @date: 2016年12月2日 下午4:44:53
	 */
	public static double sub(double v1, double v2) {// 减法
		BigDecimal b1 = BigDecimal.valueOf(v1);
		BigDecimal b2 = BigDecimal.valueOf(v2);
		return b1.subtract(b2).doubleValue();
	}

	/**
	 * 说明：两个数相乘
	 * 
	 * @Title: mul
	 * @See: {@link #mul(float, float)}
	 * @author wangt
	 * @param v1
	 * @param v2
	 * @return
	 * @date: 2016年12月2日 下午4:45:10
	 */
	public static float mul(float v1, float v2) {// 乘法
		BigDecimal b1 = BigDecimal.valueOf(v1);
		BigDecimal b2 = BigDecimal.valueOf(v2);
		return b1.multiply(b2).floatValue();
	}

	/**
	 * 说明：两个数相乘
	 * 
	 * @Title: mul
	 * @See: {@link #mul(double, double)}
	 * @author wumingqian
	 * @param v1
	 * @param v2
	 * @return
	 * @date: 2016年12月2日 下午4:45:10
	 */
	public static double mul(double v1, double v2) {// 乘法
		BigDecimal b1 = BigDecimal.valueOf(v1);
		BigDecimal b2 = BigDecimal.valueOf(v2);
		return b1.multiply(b2).doubleValue();
	}

	/**
	 * 说明：两个数相除
	 * 
	 * @Title: div
	 * @See: {@link #div(float, float)}
	 * @author wangt
	 * @param v1
	 * @param v2
	 * @return
	 * @date: 2016年12月2日 下午4:45:26
	 */
	public static float div(float v1, float v2) {// 除法
		if (Math.abs(v2 - 0) < ZORE_VALUE) {
			return 0f;
		}
		BigDecimal b1 = BigDecimal.valueOf(v1);
		BigDecimal b2 = BigDecimal.valueOf(v2);
		return b1.divide(b2, 3, BigDecimal.ROUND_HALF_UP).floatValue();
	}

	/**
	 * 说明：两个数相除
	 * 
	 * @Title: div
	 * @See: {@link #div(double, double)}
	 * @author wumingqian
	 * @param v1
	 * @param v2
	 * @return
	 * @date: 2016年12月2日 下午4:45:26
	 */
	public static double div(double v1, double v2) {// 除法
		if (Math.abs(v2 - 0) < ZORE_VALUE) {
			return 0;
		}
		BigDecimal b1 = BigDecimal.valueOf(v1);
		BigDecimal b2 = BigDecimal.valueOf(v2);
		return b1.divide(b2, 3, BigDecimal.ROUND_HALF_UP).doubleValue();
	}

	/**
	 * 说明：两个数相除
	 * 
	 * @Title: divNotReserved
	 * @See: {@link #divNotReserved(double, double)}
	 * @author panjun
	 * @param v1
	 * @param v2
	 * @return
	 * @date: 2016年12月2日 下午4:45:26
	 */
	public static double divNotReserved(double v1, double v2) {// 除法
		if (Math.abs(v2 - 0) < ZORE_VALUE) {
			return 0;
		}
		BigDecimal b1 = BigDecimal.valueOf(v1);
		BigDecimal b2 = BigDecimal.valueOf(v2);
		return b1.divide(b2).doubleValue();
	}

	/**
	 * 说明：两个数相除
	 * 
	 * @Title: div
	 * @See: {@link #div(long, long)}
	 * @author wangt
	 * @param v1
	 * @param v2
	 * @return
	 * @date: 2016年12月2日 下午4:45:26
	 */
	public static float div(long v1, long v2, int scale) {// 除法
		if (Math.abs(v2 - 0) < ZORE_VALUE)
			return 0;
		BigDecimal b1 = BigDecimal.valueOf(v1);
		BigDecimal b2 = BigDecimal.valueOf(v2);
		return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).floatValue();
	}

	/**
	 * 说明：截取3位
	 * 
	 * @Title: round
	 * @See: {@link #round(float)}
	 * @author wangt
	 * @param v
	 * @return
	 * @date: 2016年12月2日 下午4:48:00
	 */
	public static float round(float v) {// 截取3位
		BigDecimal b = BigDecimal.valueOf(v);
		BigDecimal one = BigDecimal.valueOf(1);
		return b.divide(one, 3, BigDecimal.ROUND_HALF_UP).floatValue();
	}

	/**
	 * 说明：截取3位
	 * 
	 * @Title: round
	 * @See: {@link #round(double)}
	 * @author wumingqian
	 * @param v
	 * @return
	 * @date: 2016年12月2日 下午4:48:00
	 */
	public static double round(double v) {// 截取3位
		BigDecimal b = BigDecimal.valueOf(v);
		BigDecimal one = BigDecimal.valueOf(1);
		return b.divide(one, 3, BigDecimal.ROUND_HALF_UP).doubleValue();
	}

	/**
	 * 说明：数字格式化
	 * 
	 * @Title: decimalFormat
	 * @See: {@link #decimalFormat(float)}
	 * @author wangt
	 * @param pattern
	 * @param value
	 * @return
	 * @date: 2016年12月2日 下午4:45:47
	 */
	public static String decimalFormat(String pattern, float value) {
		return new DecimalFormat(pattern).format(value);
	}

	/**
	 * 说明：数字格式化
	 * 
	 * @Title: decimalFormat
	 * @See: {@link #decimalFormat(double)}
	 * @author wumingqian
	 * @param pattern
	 * @param value
	 * @return
	 * @date: 2016年12月2日 下午4:45:47
	 */
	public static String decimalFormat(String pattern, Double value) {
		return new DecimalFormat(pattern).format(value);
	}

	/**
	 * 说明：保留两个小数
	 * 
	 * @Title: decimalFormat
	 * @See: {@link #decimalFormat(float)}
	 * @author wangt
	 * @param value
	 * @return
	 * @date: 2016年12月2日 下午4:46:13
	 */
	public static String decimalFormat(float value) {
		return new DecimalFormat("0.00").format(value);
	}

	/**
	 * 说明：保留两个小数
	 * 
	 * @Title: decimalFormat
	 * @See: {@link #decimalFormat(double)}
	 * @author wumingqian
	 * @param value
	 * @return
	 * @date: 2016年12月2日 下午4:46:13
	 */
	public static String decimalFormat(double value) {
		return new DecimalFormat("0.00").format(value);
	}

	/**
	 * 保留scale位小数
	 * 
	 * @param value
	 * @param scale
	 * @return
	 */
	public static double decimalFormat(double value, int scale) {
		BigDecimal b = BigDecimal.valueOf(value);
		double d = b.setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
		return d;
	}

	/**
	 * 说明：格式化数字
	 * 
	 * @Title: decimalBlankFormat
	 * @See: {@link #decimalBlankFormat(float)}
	 * @author wangt
	 * @param value
	 * @return
	 * @date: 2016年12月2日 下午4:47:01
	 */
	public static String decimalBlankFormat(float value) {
		return new DecimalFormat("0").format(value);
	}

	/**
	 * 说明：格式化数字
	 * 
	 * @Title: decimalBlankFormat
	 * @See: {@link #decimalBlankFormat(double)}
	 * @author wangt
	 * @param value
	 * @return
	 * @date: 2016年12月2日 下午4:47:01
	 */
	public static String decimalBlankFormat(double value) {
		return new DecimalFormat("0").format(value);
	}

	/**
	 * 说明：检查是否是数字
	 * 
	 * @Title: isNumber
	 * @See: {@link #isNumber(String)}
	 * @author wangt
	 * @param value
	 * @return
	 * @date: 2016年12月2日 下午4:47:32
	 */
	public static boolean isNumber(String value) { // 检查是否是数字
		if (StringUtil.isBlank(value)) {
			return false;
		}
		String patternStr = "^\\d+$";
		Pattern p = Pattern.compile(patternStr, Pattern.CASE_INSENSITIVE); // 忽略大小写;
		Matcher m = p.matcher(value);
		return m.find();
	}

	/**
	 * 说明：将Double[]数组转换为Float[]数组
	 * 
	 * @Title: cvtFloat
	 * @See: {@link #cvtFloat(double[])}
	 * @author wangt67
	 * @param latlng
	 * @return float[]
	 * @date: 2017年12月6日 上午8:27:31
	 */
	public static float[] cvtFloat(double[] latlng) {
		float[] result = new float[2];
		if (latlng == null || latlng.length != 2) {
			return result;
		}

		BigDecimal latDecimal = BigDecimal.valueOf(latlng[0]);
		BigDecimal lngDecimal = BigDecimal.valueOf(latlng[1]);
		result[0] = latDecimal.floatValue();
		result[1] = lngDecimal.floatValue();

		return result;
	}

	/**
	 * 说明：将float转换为Double数组
	 * 
	 * @Title: cvtDoulbe
	 * @See: {@link #cvtFloat(double[])}
	 * @author wangt67
	 * @param latlng
	 * @return double
	 * @date: 2017年12月6日 上午8:27:31
	 */
	public static double cvtDoulbe(float latlng) {
		BigDecimal latDecimal = BigDecimal.valueOf(latlng);
		return latDecimal.doubleValue();
	}

	/**
	 * 
	 * 说明：将Object转换为Double
	 * @Title: toDouble
	 * @See: {@link #toDouble}
	 * @author panjun
	 * @param object
	 * @return 
	 * @date: 2018年6月10日 上午11:12:56
	 */
	public static Double toDouble(Object object) {
		String str = StringUtil.objectToString(object);
		return toDouble(str);
	}

	/**
	 * 
	 * 说明：指定精度的除法
	 * @Title: div
	 * @See: {@link #div(double, double, int)}
	 * @author dingt5
	 * @param v1 除数
	 * @param v2 被除数
	 * @param scale 保留小数的位数
	 * @return 运算结果
	 * @date: 2018年6月8日 上午9:41:53
	 */
	public static double div(double v1, double v2,int scale) {// 除法
		if (Math.abs(v2-0)< ZORE_VALUE) {
			return 0;
		}
		BigDecimal b1 = BigDecimal.valueOf(v1);
		BigDecimal b2 = BigDecimal.valueOf(v2);
		return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
	}
	
	/**
	 * 
	 * 说明：将Object转换为Integer
	 * @Title: toInt
	 * @See: {@link #toInt(Object)}
	 * @author dingt5
	 * @param object
	 * @return 
	 * @date: 2018年7月3日 下午5:48:01
	 */
	public static Integer toInt(Object object) {
		String str = StringUtil.objectToString(object);
		return toInt(str);
	}
}
